"""
# 1. 导入unittest包
import unittest
# 2. 自定义测试类
# 注意: 必须继承自 unittest.TestCase
# 3. 自定义测试方法
# 注意: 必须以 test 开头(字母必须全小写, 别拼错单词, 例如: text)
"""

import json
import unittest
from parameterized import parameterized
from htmltestreport import HTMLTestReport

from base_service import BaseService


class MemberService(BaseService):
    """会员服务类：继承于BaseService"""

    def __init__(self):
        # 调用父类的同名方法
        super().__init__()
        # 服务名称：service_name
        self.service_name = 'MemberService'

    def find_by_telephone(self, telephone):
        """
        功能：根据手机号查询会员信息
        :param telephone: 手机号
        :return: 1. 如果会员存在，返回会员信息 2. 如果不存在，返回None
        """
        response = self.dubbo_client.invoke(self.service_name, "findByTelephone", telephone)

        #  如果response为'null'，说明没有会员，返回Python的None
        if response == 'null':
            return None
        else:
            # 否则，返回会员的字典格式信息
            # json.loads() json格式的字符串转换为Python的字典或列表
            return json.loads(response)

    def find_member_count_by_months(self, date_list):
        """
        # 功能：根据日期统计会员数
        # :param date_list: 日期列表，格式如：["2020.10", "2021.7"]
        # :return: 列表，列表元素为对应月份的会员数，如：[2,10]
        """
        response = self.dubbo_client.invoke(self.service_name, "findMemberCountByMonths", date_list)

        # json.loads() json格式的字符串转换为Python的字典或列表
        return json.loads(response)

    def add(self, info):
        """
        功能：添加会员
        :param info: 会员信息的字典格式数据，参考接口文档填入字段数据，手机号需要唯一
                     如：{"fileNumber":"D0001", "name":"李白", "phoneNumber":"13020210002"}
        :return: 添加成功返回True,  添加失败返回False
        """
        # info 增加 class对应的参数对象的类型
        info['class'] = 'com.itheima.pojo.Member'
        print('info = ', info)

        response = self.dubbo_client.invoke(self.service_name, "add", info)

        if response == 'null':
            return True
        else:
            return False


class TestMemberService(unittest.TestCase):
    """会员服务测试类"""

    @parameterized.expand([("13020210001", "13020210001"), ("13020212221", None), ("1302021abcd", None)])
    def test_find_by_telephone(self, info, expect_result):
        # info：请求参数
        # expect_result：预期结果
        print(info, expect_result)
        # 1. 实例化对象
        member_service = MemberService()
        # 2. 实例对象调用方法
        resp = member_service.find_by_telephone(info)
        print('type(resp) =', type(resp))
        print('resp = ', resp)
        # 3. 断言
        if resp != None:
            self.assertEqual(expect_result, resp.get('phoneNumber'))
        else:
            self.assertEqual(expect_result, resp)

    @parameterized.expand([(["2021.5"], [3]), (["2023.13"], [0])])
    def test_find_member_count(self, info, expect_result):
        print(info, expect_result)
        # 1. 实例化对象
        member_service = MemberService()
        # 2. 实例对象调用方法
        resp = member_service.find_member_count_by_months(info)
        print('type(resp) =', type(resp))
        print('resp = ', resp)
        # 3. 断言
        # 断言2个列表是否相等
        self.assertListEqual(expect_result, resp)


if __name__ == '__main__':
    # - 如果测试用例，和生成测试报告在同一个文件
    # - 需要通过命令运行代码，才能生成测试报告
    # 2. 生成测试套件
    suite = unittest.defaultTestLoader.discover('./', 'hm04*')

    # 3. 实例化HTMLTestReport对象
    report = HTMLTestReport('./report.html', title="传智健康测试报告", description="V1.0")

    # 4. 执行测试套件
    report.run(suite)
